// EAN5.js - EAN-5 附加码实现（常用于图书价格）
// 支持 5 位数字编码，基于校验和选择编码结构
// 参考：https://en.wikipedia.org/wiki/EAN-5

import Barcode from '../Barcode.js';
import { EAN5_STRUCTURE } from './constants.js';
import encoder from './encoder.js';

/**
 * 计算 EAN-5 校验码（决定使用哪种编码结构）
 * 规则：奇数位 ×3，偶数位 ×9，总和 mod 10
 * @param {string} data - 5 位数字字符串
 * @returns {number} 结构索引（0-9）
 */
export function checksum(data) {
	return (
		data
			.split('')
			.map(n => parseInt(n, 10))
			.reduce((sum, digit, idx) => {
				return idx % 2 === 0 ? sum + digit * 3 : sum + digit * 9;
			}, 0) % 10
	);
}

export class EAN5 extends Barcode {
	constructor(data, options) {
		super(data, options);
	}

	/**
	 * 验证输入是否合法（必须是 5 位数字）
	 * @returns {boolean}
	 */
	valid() {
		return /^[0-9]{5}$/.test(this.data);
	}

	/**
	 * 编码 EAN-5 附加码
	 * 结构：起始位 '1011' + 五位数字编码（每两位之间插入 '01' 分隔符）
	 * 编码结构由 checksum(data) 决定
	 * @returns {{ data: string, text: string }}
	 */
	encode() {
		const structureIndex = checksum(this.data);
		const structure = EAN5_STRUCTURE[structureIndex];
		const encodedData = encoder(this.data, structure, '01'); // 数字间插入 '01'

		return {
			data: '1011' + encodedData, // 完整二进制数据
			text: this.text, // 显示原始文本
		};
	}
}

